package pe.cliente.proyecto.core.service.mant.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.adra.core.ext.soporte.SuportEntidad;
import pe.adra.core.mvc.service.ADRABusinessService;
import pe.adra.util.constantes.ConstantesUtil;
import pe.adra.util.exception.DAOException;
import pe.adra.util.exception.ServiceException;
import pe.adra.util.exception.ValidarException;
import pe.adra.util.validate.ValidateUtil;
import pe.cliente.proyecto.core.constantes.ConstantesCore;
import pe.cliente.proyecto.core.dao.AsientoDAO;
import pe.cliente.proyecto.core.daobase.AsientoDAOBase;
import pe.cliente.proyecto.core.service.mant.AsientoService;
import pe.cliente.proyecto.dominio.Asiento;

@Service("AsientoService")
public class AsientoServiceImpl extends ADRABusinessService<Asiento> implements AsientoService {

	private static final Logger log = LoggerFactory.getLogger(AsientoServiceImpl.class);

	@Autowired
	private AsientoDAO asientoDAO;

	@Autowired
	private AsientoDAOBase asientoDAOBase;


	public List<Asiento> listar(Asiento filtro, Date finit, Date ffin, int inicio, int fin, String strSort, String strOrder, SuportEntidad... innerjoin) throws ServiceException {
		return null;
	}
	
	public Map<String, Object> listarMap(Asiento filtro, Date finit, Date ffin, int inicio, int fin, int filas, int pagina, String strSort, String strOrder, SuportEntidad... innerjoin) {
		Map<String, Object> objeto = new HashMap<String, Object>();
		try {
			int count = asientoDAOBase.countListaAsiento(filtro, finit, ffin);
			int total = 0;
			int records = 0;
			if (count > 0) {
				total = count / filas + 1;
			}
			List<Asiento> data = asientoDAOBase.getAsientoPorId(filtro, filas * pagina - filas, filas, strSort, strOrder, innerjoin);
			objeto.put(ConstantesUtil.PAGE, pagina);
			objeto.put(ConstantesUtil.TOTAL, total);
			if (ValidateUtil.isNotNull(data)) {
				records = data.size();
			} else {
				objeto.put(ConstantesUtil.LISTA_MENSAJE, coreMessageUtil.getMessage(ConstantesCore.STR_MSG_SIN_RESULTADOS, null));
			}
			objeto.put(ConstantesUtil.RECORDS, records);
			objeto.put(ConstantesUtil.DATA, data);
		} catch (DAOException e) {
			log.error("Error en buscar", e);
		} finally {
			objeto.put(ConstantesUtil.LISTA_ERROR, coreMessageUtil.getMessage(ConstantesCore.STR_MSG_ERROR, null));
		}
		return objeto;
	}

	@Transactional
	public Asiento guardar(Asiento entidad) throws ServiceException{
		try {
			asientoDAO.guardar(entidad);
			return entidad;
		} catch (DAOException e) {
			log.error("Error en guardar", e);
			throw new ServiceException(e);
		}
	}

	public int activo(Asiento entidad) throws ServiceException{
		try {
			asientoDAO.guardar(entidad);
			return ConstantesUtil.NUMBER_1;
		} catch (DAOException e) {
			log.error("Error en activo", e);
			throw new ServiceException(e);
		}
	}

	public Asiento obtener(Long id) throws ServiceException{
		try {
			return asientoDAO.get(id);
		} catch (DAOException e) {
			log.error("Error en obtener", e);
			throw new ServiceException(e);
		}
	}

	public void validar(Asiento entidad) throws ValidarException {

	}


}
